package com.chenshu.mycnblog.common;

/**
 * Created with IntelliJ IDEA
 * Description
 * User：chenshu
 * Date：2024-04-30
 * Time：23:34
 */

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.UUID;

/**
 * 密码校验（加盐加密）
 */
@Slf4j
public class SecurityUtil {
    /**
     *
     * @param password 明文密码
     * @return 最终存储在数据库中的加密信息
     */
    public static String encrypt(String password) {
        //生成内容不同的，长度固定的32位盐值
        String salt = UUID.randomUUID().toString().replace("-", "");
        //md5(盐值+密码)加密的固定32位字符串
        String md5Str =  DigestUtils.md5DigestAsHex((salt + password).getBytes());
        //最终将盐值和md5(盐值+密码)以某种形式存储在数据库中
        return salt + md5Str;
    }

    /**
     *
     * @param password 待验证明文密码
     * @param sqlPassword 数据库中最终密码
     * @return
     */
    public static boolean decrypt(String password, String sqlPassword) {
        if (!StringUtils.hasLength(password) || !StringUtils.hasLength(sqlPassword)) {
            return false;
        }
        if (sqlPassword.length() != 64) {
            log.error("数据库中的密码格式不对");
            return false;
        }
        // 根据存储时的规则取出盐值
        String salt = sqlPassword.substring(0, 32);
        // 使用盐值 + 待确认的密码生成待验证的加盐密码
        String md5Str =
                DigestUtils.md5DigestAsHex((salt + password).getBytes());
        String finalPassword = salt + md5Str;

        return (sqlPassword).equals(finalPassword);
    }
}
